package org.tissou.server.Operations;

import java.util.List;
import java.util.Date;
import java.util.ArrayList;

import org.tissou.client.Services.*;
import org.tissou.client.Services.MonException;


/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 18-Jan-2009
 * Time: 22:54:39
 * To change this template use File | Settings | File Templates.
 */
abstract class Operation_Courante extends Operation_Base {
  Compte Compte;
  CategorieInfos Categorie;
  String Libelle;
  Float Somme;
  boolean Verifie;
  List<Dette> Dettes;

  ProprietaireInfos PersonnePrincipale;
  MonnaieInfos Monnaie;

  public Operation_Courante(Date date, Compte compte, CategorieInfos categorie, String libelle,
                           Float somme, boolean verifie, List<Dette> dettes){
    Date = date;
    Compte = compte;
    Categorie = categorie;
    Libelle = libelle;
    Somme = somme;
    Verifie = verifie;
    Dettes = dettes;

    PersonnePrincipale = Compte.getProprio();
    Monnaie = Compte.getMonnaie();
  }

  

  public abstract ProprietaireInfos getPrincipal(Dette dette);
  public abstract Float getSommeDettePersonnePrincipale(Dette dette);
  public abstract ProprietaireInfos getTiers(Dette dette);
  public abstract Float getSommePrincipale();


  public boolean Parametres_Compatibles(){
    if (Compte.estCeQueTesVirtuelMec()){
      throw new MonException("Le compte selectionne est virtuel");
    }
    if (Somme <= 0){
      throw new MonException("La somme entree est strictement negative");
    }
    for (Dette dette : Dettes){
      if(!getPrincipal(dette).equals(Compte.getProprio())){
        throw new MonException("La personne principale de la dette n'est pas le bon proprietaire");
      }
      if(getTiers(dette).equals(getPrincipal(dette))){
        throw new MonException("On en peut pas se devoir de l'argent a soi meme, banane.");
      }
    }
    return true;
  }

  protected static boolean ConstruireAvecParametres_Compatibilite(Parametres parametres) {
    boolean resultat = true;
    if(!(parametres.NombreCategories() == 1)){
      throw new MonException("Il n'y a pas de categorie !");
    }
    if (!(parametres.NombreComptes() == 1)){
      throw new MonException("Il n'y a pas de compte !");
    }
    if (!(parametres.NombreLibelles() == 1)){
      throw new MonException("Il n'y a pas de Libelle !");
    }
    if(!(parametres.NombreSommes() == 1)){
      throw new MonException("Il n'y a pas de somme rentree !");
    }

    resultat &= (parametres.NombreProprietaires() == 0);
    resultat &= (parametres.NombreMonnaies() == 0);

    return resultat;
  }

  public List<Transaction> Retourne_Transactions() {
    List<Transaction> AAjouter = new ArrayList<Transaction>();
    AAjouter.add(new Transaction(Date, Compte, Categorie, Libelle, getSommePrincipale(), Verifie, null));
    for (Dette dette:Dettes){
      AAjouter.add(new Transaction (Date, PersonnePrincipale.RenvoyerCompteVirtuel(Monnaie), Categorie, Libelle,
          getSommeDettePersonnePrincipale(dette), Verifie, getTiers(dette)));
      AAjouter.add (new Transaction (Date, getTiers(dette).RenvoyerCompteVirtuel(Monnaie), Categorie, Libelle,
          -getSommeDettePersonnePrincipale(dette), Verifie, PersonnePrincipale));
    }
    return AAjouter;
  }
}
